#pragma once

#include <string>
#include <vector>
#include <thread>
#include <atomic>
#include <mutex>
#include <functional>
using namespace std;

// 网络通信模块，负责消息实际的转发，chatServer中的消息转发最终会调用到这里的接口
class NetworkModule
{
public:
    NetworkModule(int port);
    ~NetworkModule();

    bool start();
    void stop();
    // 向客户端发送消息，供上层调用
    void sendMessage(int clientSocket, const string &message);

    // 设置回调函数
    void setMessageCallback(function<void(int, const string &)> callback);
    void setDisconnectCallback(function<void(int)> callback);

private:
    int port;
    int serverSocket;
    vector<int> clientSockets;
    mutex clientMutex;
    thread acceptThread;
    atomic<bool> running;
    function<void(int, const string &)> messageCallback;
    function<void(int)> disconnectCallback;

    // 创建客户端连接，创建新的独立的客户端监听线程handleClient
    void acceptConnections();

    // 循环接受客户端消息，每个客户端都会有一个线程，在线程中循环监听客户端发来的消息
    void handleClient(int clientSocket);
};